﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace aula14
{
    class Program
    {
        delegate int Operador(int x);
        delegate int Trans(int i);
        static int Calc(int x) { return 10 / x; }

        static void Display(string nome)
        {
            if (nome == null)
                throw new ArgumentNullException("nome");
            Console.WriteLine(nome);
        }
        public static int Quadrado(int x)
        {
            return x * x;
        }

        public static int Quadrado1(int x) {
            Console.WriteLine("nada faz");
            return x * x;
        }
        public static int Cubo(int x) { return x * x * x; }

        static void Main(string[] args)
        {
            Console.WriteLine("\nexemplo1 (pilhas push mete pop tira valores)");
            Stack<int> stack = new Stack<int>() ;
            stack.Push ( 5 ) ;
            stack.Push ( 19 ) ;  
            int x = stack.Pop ( ) ;
            int y = stack.Pop ( ) ;
            Console.WriteLine(x + ":" + y);

            Console.WriteLine("\nexemplo2  (troca as referecias)");
            int a = 10;
            int b = 11;
            Console.WriteLine(a + ":" + b);
            swap.Swap(ref a, ref b);
            Console.WriteLine(a + ":" + b);

            string s1 = "sistemas operativos";
            string s2 = "linguagens prog";
            Console.WriteLine(s1 + ":" + s2);
            swap.Swap(ref s1, ref s2);
            Console.WriteLine(s1 + ":" + s2);

            Console.WriteLine("\nexemplo3  (delegates com funcoes)");
            TesteDelegate.Operador op99 = Quadrado;
            Console.WriteLine(op99(3));
            op99 = Cubo;
            Console.WriteLine(op99(3));


            Console.WriteLine("\n(delegates feito na proria classe)");
            Operador op1 = Quadrado;
            Console.WriteLine(op1(3));
            op1 = Cubo;
            Console.WriteLine(op1(3));

            Console.WriteLine("\nexemplo4");
            Operador op = Quadrado1;
            op += Cubo;
            int z = op(3);
            Console.WriteLine(z);


            Console.WriteLine("\nexemplo5");
            int[] valores = { 1, 2, 3 };
            Util.Mostrar(valores);
            Util.Transformador(valores, Quadrado);
            foreach (int i in valores) Console.Write(i + " ");


            Console.WriteLine("\n\nexemplo6");
            int[] valores1 = { 1, 2, 3 };
            UtilAF.Mostrar(valores1);
            UtilAF.Transformador(valores1, Quadrado);
            foreach (int i in valores1) Console.Write(i + " ");
           
            Console.WriteLine("\n\nexemplo7");
            Trans sqr = x1 => x1 * x1;
            Console.WriteLine(sqr(4));
            Trans cubo = x1 => { return x1 * x1 * x1; };
            Console.WriteLine(cubo(3));
            Func<int, int> squa = x1 => x1 * x1;
            Console.WriteLine(squa(4));

            Console.WriteLine("\n\nexemplo8 e 9");
            try
            {
                int y1 = Calc(0);
                Console.WriteLine(y1);
            }
          catch (DivideByZeroException ex)
            {
                Console.WriteLine("x tem de ser diferente de 0");
            }
            Console.WriteLine("\n\nexemplo10");
            try { Display(null); }
            catch(ArgumentNullException)
            {
                Console.WriteLine("processa .....");
            }
            Console.ReadLine();
        }
    }
}
